home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Libraries / mui / hslider.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  14.2 KB  |  489 lines  |  [TEXT/CWIE]

  1. /*
  2.  * Copyright (c) 1990,1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
  36.  */
  37.  
  38. #include "glut.h"
  39. #include <stdlib.h>
  40. #include "gizmo.h"
  41. #include "hslider.h"
  42. #include "displaylist.h"
  43. #include "uicolor.h"
  44.  
  45. extern    HSlider *locatedhs;
  46.  
  47. int gethstrough(muiObject *obj)
  48. {
  49.     return obj->xmax - obj->xmin - 2*ARROWHEIGHT;
  50. }
  51.  
  52. void    sethscenter(muiObject *obj, int scenter)
  53. {
  54.     HSlider *hs = (HSlider *)obj->object;
  55.     if ((scenter - hs->shalf) < (obj->xmin+ARROWHEIGHT))
  56.         hs->scenter = gethstrough(obj)/2 + obj->xmin+ARROWHEIGHT;
  57.     else
  58.         hs->scenter = scenter;
  59. }
  60.  
  61. void    muiSetHSArrowDelta(muiObject *obj, int newd)
  62. {
  63.     HSlider *hs = (HSlider *)obj->object;
  64.     hs->arrowdelta = newd;
  65. }
  66.  
  67. HSlider    *newhs(muiObject *obj, int xmin, int xmax, int scenter, int shalf)
  68. {
  69.     HSlider    *hs;
  70.  
  71.     hs = (HSlider *)malloc(sizeof(HSlider));
  72.     obj->object = (HSlider *)hs;
  73.     if (shalf == 0) {
  74.     hs->shalf = 0;
  75.     } else if (shalf < MINSHALF) 
  76.     hs->shalf = MINSHALF;
  77.     else
  78.     hs->shalf = shalf;
  79.  
  80.     if ((xmax - xmin + 1) <= (2*ARROWHEIGHT+2*MINSHALF))
  81.         hs->thumb = 0;
  82.     else
  83.         hs->thumb = 1;
  84.  
  85.     sethscenter(obj, scenter);
  86.     hs->oldpos = hs->scenter;
  87.  
  88.     muiSetHSArrowDelta(obj, 1);
  89.     return hs;
  90. }
  91.  
  92. void    freehs(HSlider *hs)
  93. {
  94.     if (hs) {
  95.     free(hs);
  96.     }
  97. }
  98.  
  99. void    drawhsarrows(muiObject *obj)
  100. {
  101.     int    ymin = obj->ymin, ymax = obj->ymin+ARROWHEIGHT,
  102.         xmin = obj->xmin, xmax = obj->xmax;
  103.  
  104.     if (!muiGetVisible(obj))
  105.         return;
  106.  
  107.     /* Draw the arrows: */
  108.  
  109.     /* down arrow */
  110.     uiDkGray();
  111.         uirecti(xmin,ymin,xmin+20,ymax);
  112.  
  113.     if (muiGetVisible(obj)) {
  114.         if (obj->locate == SCROLLDOWN) {
  115.             if (obj->select == SCROLLDOWN) {
  116.                 drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiMmGray,uiWhite);
  117.                 drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiLtGray,uiWhite);
  118.         } else {
  119.                 drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiWhite,uiMmGray);
  120.                 drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiWhite,uiLtGray);
  121.         }
  122.             uiVyLtGray();
  123.             uirectfi(xmin+3,ymin+3,xmin+17,ymax-3);
  124.         } else {
  125.             if (obj->select == SCROLLDOWN) {
  126.                 drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiMmGray,uiVyLtGray);
  127.                 drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiMmGray,uiVyLtGray);
  128.         } else {
  129.                 drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiWhite,uiMmGray);
  130.                 drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiVyLtGray,uiMmGray);
  131.         }
  132.             uiLtGray();
  133.             uirectfi(xmin+3,ymin+3,xmin+17,ymax-3);
  134.         }
  135.     } else {
  136.         drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  137.         uiLtGray();
  138.             uirectfi(xmin+2,ymin+2,xmin+18,ymax-2);
  139.     }
  140.  
  141.     /* arrow XXX probably wrong for hsliders XXX */
  142.     if (muiGetEnable(obj))
  143.         uiDkGray();
  144.     else
  145.         uiMmGray();
  146.     uimove2i(xmin+14, ymin+5);
  147.     uidraw2i(xmin+14, ymin+14);
  148.     uiendline();
  149.     uirectfi(xmin+13,ymin+6,xmin+12,ymin+13);
  150.     uirectfi(xmin+11,ymin+7,xmin+10,ymin+12);
  151.     uirectfi(xmin+8,ymin+8,xmin+9,ymin+11);
  152.     uirectfi(xmin+6,ymin+9,xmin+7,ymin+10);
  153.    
  154.     /* up arrow */
  155.     uiDkGray();
  156.         uirecti(xmax-20,ymin,xmax,ymax);
  157.  
  158.     if (muiGetEnable(obj)) {
  159.         if (obj->locate == SCROLLUP) {
  160.             if (obj->select == SCROLLUP) {
  161.                 drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiMmGray,uiWhite);
  162.                 drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiLtGray,uiWhite);
  163.         } else {
  164.                 drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiWhite,uiMmGray);
  165.                 drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiWhite,uiLtGray);
  166.         }
  167.             uiVyLtGray();
  168.             uirectfi(xmax-17,ymin+3,xmax-3,ymax-3);
  169.         } else {
  170.             if (obj->select == SCROLLUP) {
  171.                 drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiMmGray,uiVyLtGray);
  172.                 drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiMmGray,uiVyLtGray);
  173.         } else {
  174.                 drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiWhite,uiMmGray);
  175.                 drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiVyLtGray,uiMmGray);
  176.         }
  177.             uiLtGray();
  178.             uirectfi(xmax-17,ymin+3,xmax-3,ymax-3);
  179.         }
  180.     } else {
  181.     drawedges(xmin+1,xmax-1,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  182.         uiLtGray();
  183.         uirectfi(xmax-18,ymin+2,xmax-2,ymax-2);
  184.     }
  185.  
  186.     /* arrow XXX probably wrong for hslider XXX */
  187.     if (muiGetEnable(obj))
  188.         uiDkGray();
  189.     else
  190.         uiMmGray();
  191.     uirectfi(xmax-6,ymin+9,xmax-7,ymin+10);
  192.     uirectfi(xmax-8,ymin+8,xmax-9,ymin+11);
  193.     uirectfi(xmax-10,ymin+7,xmax-11,ymin+12);
  194.     uirectfi(xmax-12,ymin+6,xmax-13,ymin+13);
  195.     uimove2i(xmax-14, ymin+5);
  196.     uidraw2i(xmax-14, ymin+14);
  197.     uiendline();
  198. }
  199.  
  200. void    drawhs(muiObject *obj)
  201. {
  202.     HSlider *hs = (HSlider *)obj->object;
  203.  
  204.     int    ymin = obj->ymin, xmax = obj->xmax-ARROWHEIGHT, 
  205.         xmin = obj->xmin+ARROWHEIGHT;
  206.     int     ymax = ymin+SLIDERWIDTH;
  207.     int    sxmin = hs->scenter - hs->shalf;
  208.     int    sxmax = hs->scenter + hs->shalf;
  209.     int    oldsxmin = hs->oldpos - hs->shalf;
  210.     int    oldsxmax = hs->oldpos + hs->shalf;
  211.  
  212.     drawsetup();
  213.  
  214.     if (!muiGetVisible(obj)) {
  215.     backgrounddraw(xmin,ymin,xmax,ymax);
  216.         drawrestore();
  217.         return;
  218.     }
  219.  
  220.     /* trough */
  221.  
  222.     uiDkGray();
  223.         uirecti(xmin, ymin, xmax, ymax);
  224.  
  225.     drawedges(xmin+1,xmax-1,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  226.  
  227.     uiLtGray();
  228.         uirectfi(xmin+2, ymin+2, xmax-2, ymax-2);
  229.  
  230.     if (hs->thumb) {
  231.         /* last thumb position */
  232.         if ((hs->oldpos != hs->scenter) && (obj->enable)) {
  233.     
  234.             uiDkGray();
  235.             uimove2i(oldsxmax, ymax-2);
  236.             uidraw2i(oldsxmax, ymin+1);
  237.         uiendline();
  238.     
  239.             uiMmGray();
  240.             uimove2i(oldsxmax, ymin+1);
  241.             uidraw2i(oldsxmin, ymin+1);
  242.         uiendline();
  243.         
  244.             uiVyLtGray();
  245.             uimove2i(oldsxmin, ymin+2);
  246.             uidraw2i(oldsxmin, ymax-1);
  247.         uiendline();
  248.     
  249.             uiLtGray();
  250.             uimove2i(oldsxmin, ymax-1);
  251.             uidraw2i(oldsxmax, ymax-1);
  252.         uiendline();
  253.  
  254.             uiVyLtGray();
  255.             uimove2i(--oldsxmax, ymax-2);
  256.             uidraw2i(++oldsxmin, ymax-2);
  257.             uidraw2i(oldsxmin, ymin+2);
  258.         uiendline();
  259.     
  260.             uiVyDkGray();
  261.             uimove2i(oldsxmin, ymin+2);
  262.             uidraw2i(oldsxmax, ymin+2);
  263.             uidraw2i(oldsxmax, ymax-3);
  264.         uiendline();
  265.     
  266.             uiDkGray();
  267.             uimove2i(--oldsxmax, ymin+3);
  268.             uidraw2i(oldsxmax, ymax-3);
  269.         uiendline();
  270.         
  271.             uiLtGray();
  272.             uimove2i(oldsxmax, ymax-3);
  273.             uidraw2i(++oldsxmin, ymax-3);
  274.             uidraw2i(oldsxmin, ymin+3);
  275.         uiendline();
  276.     
  277.             uiMmGray();
  278.             uirectfi(++oldsxmin, ymin+3, --oldsxmax, ymax-4);
  279.         
  280.         }
  281.  
  282.         if (obj->enable) {
  283.  
  284.             /* thumb */
  285.             uiDkGray();
  286.                 uirecti(sxmin,ymin,sxmax,ymax);
  287.             if (obj->locate == THUMB) {
  288.             drawedges(sxmin+1,sxmax-1,ymin+1,ymax-1,uiWhite,uiDkGray);
  289.             drawedges(sxmin+2,sxmax-2,ymin+2,ymax-2,uiWhite,uiLtGray);
  290.             drawedges(sxmin+3,sxmax-3,ymin+3,ymax-3,uiWhite,uiLtGray);
  291.     
  292.             uiVyLtGray();
  293.                 uirectfi(sxmin+4, ymin+4, sxmax-4, ymax-4);
  294.         
  295.             /* ridges on thumb */
  296.             uiDkGray();
  297.                 uimove2i(hs->scenter, ymin+3);
  298.                 uidraw2i(hs->scenter, ymax-3);
  299.             uiendline();
  300.                 uimove2i(hs->scenter-4, ymin+3);
  301.                 uidraw2i(hs->scenter-4, ymax-3);
  302.             uiendline();
  303.                 uimove2i(hs->scenter+4, ymin+3);
  304.                 uidraw2i(hs->scenter+4, ymax-3);
  305.             uiendline();
  306.    
  307.             uiWhite();
  308.             uirectfi(hs->scenter+1,ymin+3,hs->scenter+2,ymax-3);
  309.             uirectfi(hs->scenter+5,ymin+3,hs->scenter+6,ymax-3);
  310.             uirectfi(hs->scenter-2,ymin+3,hs->scenter-3,ymax-3);
  311.             } else {
  312.             drawedges(sxmin+1,sxmax-1,ymin+1,ymax-1,uiWhite,uiDkGray);
  313.             drawedges(sxmin+2,sxmax-2,ymin+2,ymax-2,uiVyLtGray,uiMmGray);
  314.             drawedges(sxmin+3,sxmax-3,ymin+3,ymax-3,uiVyLtGray,uiMmGray);
  315.    
  316.               uiLtGray();
  317.                   uirectfi(sxmin+4, ymin+4, sxmax-4, ymax-4);
  318.             
  319.             /* ridges on thumb */
  320.             uiBlack();
  321.                 uimove2i(hs->scenter, ymin+3);
  322.                 uidraw2i(hs->scenter, ymax-3);
  323.             uiendline();
  324.                 uimove2i(hs->scenter-4, ymin+3);
  325.                 uidraw2i(hs->scenter-4, ymax-3);
  326.             uiendline();
  327.                 uimove2i(hs->scenter+4, ymin+3);
  328.                 uidraw2i(hs->scenter+4, ymax-3);
  329.             uiendline();
  330.  
  331.             uiWhite();
  332.                 uimove2i(hs->scenter+1, ymin+3);
  333.                 uidraw2i(hs->scenter+1, ymax-3);
  334.             uiendline();
  335.                 uimove2i(hs->scenter-3, ymin+3);
  336.                 uidraw2i(hs->scenter-3, ymax-3);
  337.             uiendline();
  338.                 uimove2i(hs->scenter+5, ymin+3);
  339.                 uidraw2i(hs->scenter+5, ymax-3);
  340.             uiendline();
  341.             }
  342.         }
  343.     }
  344.     drawhsarrows(obj);
  345.  
  346.     drawrestore();
  347. }
  348.  
  349. enum muiReturnValue hshandler(muiObject *obj, int event, int value, int x, int y)
  350. {
  351.     int my = x;
  352.     static int mfudge=0;
  353.     static enum muiReturnValue retval = MUI_NO_ACTION;
  354.     HSlider *hs = (HSlider *)obj->object;
  355.  
  356.     if (!muiGetEnable(obj) || !muiGetVisible(obj))
  357.     return MUI_NO_ACTION;
  358.     switch (event) {
  359.     case MUI_DEVICE_RELEASE:
  360.         if (value == 0) { 
  361.         hs->oldpos = hs->scenter; 
  362.         muiSetSelect(obj, 0);
  363.         return MUI_SLIDER_RETURN; 
  364.         }
  365.     case MUI_DEVICE_PRESS:
  366.     case MUI_DEVICE_CLICK:
  367.         /* in the arrows */
  368.         if (my >= obj->xmin && my <= obj->xmax && 
  369.            (my < obj->xmin+ARROWHEIGHT || my > obj->xmax-ARROWHEIGHT)) {
  370.         mfudge = -10000;
  371.         if (my < obj->xmin+ARROWHEIGHT) { /* boink down */
  372.             my = hs->scenter - hs->arrowdelta;
  373.             retval = MUI_SLIDER_SCROLLDOWN;
  374.         } else { /* boink up */
  375.             my = hs->scenter + hs->arrowdelta;
  376.             retval = MUI_SLIDER_SCROLLUP;
  377.         }
  378.         if (event == MUI_DEVICE_CLICK) {
  379.             muiSetSelect(obj, 0);
  380.             retval = MUI_SLIDER_RETURN;
  381.         }
  382.         if (my - hs->shalf < obj->xmin+1+ARROWHEIGHT)
  383.             my = obj->xmin+1+hs->shalf+ARROWHEIGHT;
  384.         if (my + hs->shalf > obj->xmax-1-ARROWHEIGHT) 
  385.             my = obj->xmax-1-hs->shalf-ARROWHEIGHT;
  386.         hs->scenter = my; 
  387.         break;
  388.         } else if (my >= obj->xmin && my <= obj->xmax)
  389.             retval = MUI_SLIDER_THUMB;
  390.         hs->oldpos = hs->scenter;
  391.         if (my >= hs->scenter-hs->shalf && my <= hs->scenter+hs->shalf)
  392.         mfudge = hs->scenter - my;
  393.         else
  394.         mfudge = 0;
  395.         break;
  396.     case MUI_DEVICE_DOWN:
  397.         if (mfudge == -10000) {    /* auto - repeat the arrow keys */
  398.                 if (retval == MUI_SLIDER_SCROLLDOWN) {
  399.                     my = hs->scenter - hs->arrowdelta;
  400.                     if (my - hs->shalf < obj->xmin+1+ARROWHEIGHT)
  401.                         my = obj->xmin+1+hs->shalf+ARROWHEIGHT;
  402.                 } else {
  403.                     my = hs->scenter + hs->arrowdelta;
  404.                     if (my + hs->shalf > obj->xmax-1-ARROWHEIGHT)
  405.                         my = obj->xmax-1-hs->shalf-ARROWHEIGHT;
  406.                 }
  407.                 hs->scenter = my;
  408.                 break;
  409.         }
  410.         my = x+mfudge;
  411.         if (my - hs->shalf < obj->xmin+1+ARROWHEIGHT)
  412.         my = obj->xmin+1+hs->shalf+ARROWHEIGHT;
  413.         if (my + hs->shalf > obj->xmax-1-ARROWHEIGHT) 
  414.         my = obj->xmax-1-hs->shalf-ARROWHEIGHT;
  415.  
  416.         /* adjust thumb */
  417.         hs->scenter = my; 
  418.         break;
  419.     }
  420.     y = y;    /* for lint's sake */
  421.     return retval;
  422. }
  423.  
  424. float muiGetHSVal(muiObject *obj)
  425. {
  426.     HSlider *hs = (HSlider *)obj->object;
  427.  
  428.     return (hs->scenter-obj->xmin-1.0-hs->shalf-ARROWHEIGHT)/
  429.         (obj->xmax - obj->xmin - 2.0*hs->shalf - 2.0-2*ARROWHEIGHT);
  430. }
  431.  
  432. void    sethshalf(muiObject *obj, int shalf)
  433. {
  434.     HSlider *hs = (HSlider *)obj->object;
  435.     hs->shalf = shalf;
  436.     if (hs->shalf==0)
  437.     muiSetEnable(obj, 0);
  438.     else if (hs->shalf < MINSHALF) {
  439.         hs->shalf = MINSHALF;
  440.     muiSetEnable(obj, 1);
  441.     } else if (2*hs->shalf >= gethstrough(obj)) {
  442.         hs->shalf = gethstrough(obj)/2;
  443.     muiSetEnable(obj, 0);
  444.     }
  445. }
  446.  
  447. void    movehsval(muiObject *obj, float val)
  448. {
  449.     float    f;
  450.     HSlider *hs = (HSlider *)obj->object;
  451.  
  452.     if (val < 0.0) val = 0.0;
  453.     if (val > 1.0) val = 1.0;
  454.     f = val*(obj->xmax - obj->xmin - 2.0*hs->shalf - 2.0-2*ARROWHEIGHT);
  455.     hs->scenter = f + hs->shalf + obj->xmin + 1.0+ARROWHEIGHT;
  456.  
  457.     if ((hs->scenter + hs->shalf) > (obj->xmax - ARROWHEIGHT))
  458.         hs->scenter = obj->xmax - ARROWHEIGHT - hs->shalf;
  459.     if ((hs->scenter - hs->shalf) < (obj->xmin+ ARROWHEIGHT))
  460.         hs->scenter = obj->xmin + ARROWHEIGHT + hs->shalf;
  461. }
  462.  
  463. void    muiSetHSValue(muiObject *obj, float val)
  464. {
  465.     HSlider *hs = (HSlider *)obj->object;
  466.     movehsval(obj, (float) val);
  467.     hs->oldpos = hs->scenter;
  468. }
  469.  
  470. /* 
  471.  * visible is windowheight/dataheight
  472.  * top is top/dataheight
  473.  */
  474.  
  475. void
  476. adjusthsthumb(muiObject *obj, double visible, double top)
  477. {
  478.     int size;
  479.     
  480.     if (visible >= 1.0) {
  481.         size = gethstrough(obj) + 1;
  482.     } else {
  483.         size = visible*gethstrough(obj);
  484.     }
  485.     muiSetEnable(obj, 1);
  486.     sethshalf(obj, size/2);
  487.     muiSetHSValue(obj, (float) (1.0 - top));
  488. }
  489.